package com.zhanglijie.base.other.threadlocalDemo;

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

import co.paralleluniverse.strands.dataflow.Var;

/**
 * @author zhanglijie
 * @version 1.0
 * @since 1.1.0 2022/7/2 0002 19:39
 * 强引用：只有没有没引用指向了 发生gc会清理
 * 软引用：在内存吃紧情况下，即时有引用指向了（但是是软引用指向） 发生gc会回收
 * 弱引用： 不管是否内存吃紧也不管引用指向还在（这个指向是弱引用指向）， 发生gc一定会回收
 * 如果弱引用被强引用引用了  本来是可以弱引用指向还在发生gc是可以回收的，但是由于这个弱引用又被强引用指向了 所以不会gc回收
 * 比如下面的案例，或者threadLocal案例中threadlocal定位全局变量时候
 *
 * 上面情况案例是会发生内存溢出的，由于强引用指向弱引用对象这个 强引用还存在。
 * 1.如果强引用没有呢，就是说threadlocal的key 没有强引用指向，value仅仅值覆盖会发生吗？
 * 答案是会,因为key回收了，value就是被引用没放弃的垃圾 会一直不被回收。
 * 2.如果不考虑key,也就是说threadlocal.add()不停的值覆盖会移除吗，会如线程池使用  见案例 ThreadPoolUseThreadLocalDemo
 *
 * 最终解决：threadlocal使用完一定remove
 */
public class ThreadLocalDemo {
    public static void main(String[] args) throws InterruptedException {



        Person zhangsan = new Person(new Man("zhangsan"));
        Man lisi = new Man("lisi");//强引用
        Person person1 = new Person(lisi);

        System.gc();
        Thread.sleep(1000);
        System.out.println("zhagnsan="+zhangsan.get());
        System.out.println("lisi="+person1.get());
    }
}
class Person extends WeakReference<Man>{

    public Person(Man referent) {
        super(referent);
    }
}
class Man{
    @Override
    protected void finalize(){
        System.out.println(this);
    }
    @Override
    public String toString() {
        return "Man{" + "name='" + name + '\'' + '}';
    }

    public Man(String name) {
        this.name = name;
    }

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
